/*
 * @Author: Wangjun
 * @Date: 2023-08-03 09:51:03
 * @LastEditTime: 2023-09-06 09:19:28
 * @LastEditors: Wangjun
 * @Description:
 * @FilePath: \nodex\nodelogic\op_sra.go
 * hnxr
 */
package nodelogic

import (
	"gitee.com/hnxr_1/nodex"
)

func init() {
	nodex.Reister(new(SRA))
}

// SRA 保持触发器
// 当置位信号和复位信号同时存在时，输出M状态。
type SRA struct {
	nodex.Node
	X1    nodex.Double
	S     nodex.Boolean `remark:"置位"`      //置位
	R     nodex.Boolean `remark:"复位"`      //复位
	C     nodex.Double  `remark:"延迟次数C,1"` //模式选择
	count int           //上一次的值

	Y nodex.Double `remark:"输出Y,,out"`
}

func (m *SRA) GetModelID() int {
	return nodex.ModLogic
}

/**
 * @description:
 * @return {*}
 */
func (m *SRA) GetName() string {
	return "SRA"
}

func (m *SRA) RegData() []byte {
	return nodex.MakeRegData(m, "保持寄存器", m.GetName(), "")
}

func (m *SRA) ResetValue() {
	m.Node.ResetValue()
	m.C.Value = 1
}

func (m *SRA) Init(mem *nodex.Memory) (err error) {
	if int(m.C.Value) <= 0 {
		m.C.Value = 1
	}
	return
}
func (m *SRA) Calc() (err error) {
	if m.EnQ {
		if *m.S.Bad || *m.R.Bad || *m.C.Bad {
			m.Bad = true
			return //不计算
		}
	}
	m.Bad = false

	if m.S.Value {
		if m.count == 0 {
			m.Y.Value = m.X1.Value
			m.count = int(m.C.Value)
		}
		return
	}
	if m.count <= 0 {
		m.Y.Value = 0
	}
	if m.R.Value {
		if m.count > 0 {
			m.count--
		}
		return
	}
	return
}
